/**
 *	QuebraLink - Quebrador de links que tem protetor
 *  Copyright (C) 2011  Ranis <ranishot@gmail.com>
 * 
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *
 *  Classe para Enviar E-mail
 *
 *	Esta Classe envia emails para feedbacks do Projeto QuebraLink
 *
 *	@package QuebraLink
 *	@name Encoder.java
 *	@author	Ranishot <ranishot@gmail.com>
 *	@copyright (C)2010 - 2011 Ranishot
 *	@contributors Rodrigo Borges <rodrigo@rbmsoft.com.br>
 *	@license GNU GPL v3
 *	@version 3.5
 *	@since 09/06/2011
 *	
*/
package quebralink;

import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Encoder {

    private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+/";
    private static final int splitLinesAt = 76;

    public static byte[] zeroPad(int length, byte[] bytes) {
        byte[] padded = new byte[length]; // initialized to zero by JVM  
        System.arraycopy(bytes, 0, padded, 0, bytes.length);
        return padded;
    }

    public static String encodeBase64(String string) {

        String encoded = "";
        byte[] stringArray;
        try {
            stringArray = string.getBytes("UTF-8");  // use appropriate encoding string!  
        } catch (Exception ignored) {
            stringArray = string.getBytes();  // use locale default rather than croak  
        }
        // determine how many padding bytes to add to the output  
        int paddingCount = (3 - (stringArray.length % 3)) % 3;
        // add any necessary padding to the input  
        stringArray = zeroPad(stringArray.length + paddingCount, stringArray);
        // process 3 bytes at a time, churning out 4 output bytes  
        // worry about CRLF insertions later  
        for (int i = 0; i < stringArray.length; i += 3) {
            int j = ((stringArray[i] & 0xff) << 16)
                    + ((stringArray[i + 1] & 0xff) << 8)
                    + (stringArray[i + 2] & 0xff);
            encoded = encoded + base64code.charAt((j >> 18) & 0x3f)
                    + base64code.charAt((j >> 12) & 0x3f)
                    + base64code.charAt((j >> 6) & 0x3f)
                    + base64code.charAt(j & 0x3f);
        }
        // replace encoded padding nulls with "="  
        return splitLines(encoded.substring(0, encoded.length()
                - paddingCount) + "==".substring(0, paddingCount));

    }

    public static String splitLines(String string) {

        String lines = "";
        for (int i = 0; i < string.length(); i += splitLinesAt) {

            lines += string.substring(i, Math.min(string.length(), i + splitLinesAt));
            lines += "\r\n";

        }
        return lines;

    }

    public static String EncodeHex(String text) {

     String result = "";
        for (int i = 0; i < text.length(); i++) {
            result += Integer.toHexString(text.charAt(i));
        }
        
        return result;
    }
}
